<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 为什么函数可以通过点语法使用call bind apply??? 函数.call() Function.prototype的原型有call bind apply方法
    // 1. 借用函数 2. 改变this指向
    // var fn = new Function()
    // var fn = function() {}
    // 理解这个call的由来之后 我们封装自己call 
    Function.prototype.mybind = function (that = window) {
      console.log(this, 111) // this就是fn这个函数
      that.ff = this // that.ff = function fn () {}
      return function (...arg) {
        // console.log(arguments, 66666, arg) //  [2, 6]
        var result = that.ff(...arg)
        delete that.ff
        return result
      }
    }
    function fn (a, b) { 
      console.log('hello', this, a, b)
      return a + b
    }
    // bind不会立即调用 返回的是一个改变this执行之后的函数 但是需要自己手动调用
    var p = {name: 'zs'}
    var resultFn = fn.mybind(p)
    // var resultFn = function () {
    //   that.ff()
    // }
    console.log(resultFn(2, 6))


    /* var o = {}
    o.ff = function fn (a, b) { 
      console.log('hello', this, a, b)
      return a + b
    } */
  </script>
</body>
</html>
